<template>
	<view class="tm-rate d-inline-block">
		<view @touchstart="ishover=false" @touchend="ishover=disabled?false:true" v-for="(item,index) in num" :key="index" class="d-inline-block" :class="[ishover&&index+1==indexStar?'ani':'','pr-'+margin]">
			<tm-icons :black="black_tmeme" dense @click="clicSelect(index+1)" :size="size" :color="index+1 <= indexStar?color_tmeme:uncolor"
				:name="icon"></tm-icons>
		</view>
		<slot name="default" :num="num"><text v-if="showNum" :class="['text-'+color_tmeme]">{{indexStar}}</text></slot>
	</view>
</template>

<script>
	/**
	 * 评分
	 * @property {String} color = [] 默认：primary，选中的颜色
	 * @property {String} uncolor = [] 默认：grey-lighten-2，未选中的颜色
	 * @property {Number} num = [] 默认：5，数量
	 * @property {Number} value = [] 默认：0，当前的评分，推荐：value.sync或者v-model.
	 * @property {Number} size = [] 默认：32，单位upx,图标大小。
	 * @property {Number} margin = [] 默认：16，单位upx,间隙。
	 * @property {Boolean} disabled = [] 默认：false，是否禁用。
	 * @property {Boolean} black = [] 默认：null，暗黑模式。
	 * @property {Boolean} show-num = [] 默认：false，是否展示评分数字。
	 * @property {Boolean} icon = [] 默认：icon-collection-fill，图片名称，可以自定义其它的。
	 * @property {String} name = [] 默认：''，提交表单时的的字段名称标识
	 * @property {Function} change 评分改变时触发，参数当前的评分。
	 */
	import tmIcons from "@/tm-vuetify/components/tm-icons/tm-icons.vue"
	export default {
		components:{tmIcons},
		name: "tm-rate",
		model: {
			prop: "value",
			event: "input"
		},
		props: {
			//提交表单时的的字段名称
			name:{
				type:String,
				default:''
			},
			color: {
				type: String,
				default: "primary"
			},
			uncolor: {
				type: String,
				default: "grey-lighten-2"
			},
			black:{
				type:Boolean|String,
				default:null
			},
			num: {
				type: Number,
				default: 5
			},
			value: {
				type: Number,
				default: 0
			},
			size: {
				type: Number,
				default: 42
			},
			margin: {
				type: Number,
				default: 16
			},
			disabled: {
				type: Boolean,
				default: false
			},
			showNum:{
				type: Boolean,
				default: false
			},
			icon:{
				type: String,
				default: 'icon-collection-fill'
			},
			// 跟随主题色的改变而改变。
			fllowTheme:{
				type:Boolean|String,
				default:true
			}
		},
		computed: {
			black_tmeme:function(){
				if(this.black!==null) return this.black;
				return this.$tm.vx.state().tmVuetify.black;
			},
			color_tmeme:function(){
				if(this.$tm.vx.state().tmVuetify.color!==null&&this.$tm.vx.state().tmVuetify.color && this.fllowTheme){
					return this.$tm.vx.state().tmVuetify.color;
				}
				return this.color;
			},
			indexStar: {
				get: function() {
					
					return this.value;
				},
				set: function(val) {
					let dval = val;
					if(val > this.num) dval = this.num;
					this.$emit("input",val)
					this.$emit("update:value",val)
					this.$emit("change",val)
				
				}
			}
		},
		data() {
			return {
				ishover:false,
			};
		},
		methods: {
			clicSelect(index) {
				if (this.disabled) return;
				this.indexStar = index;
				
			}
		},
	}
</script>

<style lang="scss" scoped>
	.tm-rate{
		.ani {
			animation: ani 0.2s  linear;
		}
	}
	
	@keyframes ani {
		0% {
			transform: scale(0.85)
		}
	
		50% {
			transform: scale(1.2)
		}
	
		100% {
			transform: scale(0.85)
		}
	}
</style>
